/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package TADs;

import javax.swing.JOptionPane;

/**
 *
 * @author Achiles
 */
public class ArvoreBinaria {

    
    NoArvore raiz;

    public ArvoreBinaria() {
        raiz = null;
    }

    public void inserirNo(int valor) {
        if (raiz == null) {
            raiz = new NoArvore(valor);
        } else {
            raiz.inserir(valor);
        }
    }
    
// Método pre – ordem
// Utilizado para percorrer a ávore na forma Prefixa
    public void preOrdem() {
        preOrdemAjudante(raiz);
    }
    
// Método para percorrer a árvore em pre – ordem
// utiliza a recursão para percorrer os nos da ávore
    public void preOrdemAjudante(NoArvore no) {
        if (no == null) {
            return;
        }
        JOptionPane.showMessageDialog(null,no.dado+"");
        preOrdemAjudante(no.noEsquerdo);
        preOrdemAjudante(no.noDireito);
    }
    
// Método ordem simetrica
// Utilizado para percorre a ávore na forma infixa
    public void ordemSimetrica() {
        ordemSimetricaAjudante(raiz);
    }
    
// Método para percorrer a árvore em Ordem Simetrica
// utiliza a recursão para percorrer os nos da ávore
    public void ordemSimetricaAjudante(NoArvore no) {
        if (no == null) {
            return;
        }
        ordemSimetricaAjudante(no.noEsquerdo);
        JOptionPane.showMessageDialog(null,no.dado+"");
        ordemSimetricaAjudante(no.noDireito);
    }
    
// Método pós Ordem
// Utilizado para percorrer a ávore na forma pósfixa
    public void posOrdem() {
        posOrdemAjudante(raiz);
    }
    
// Método que percorre a árvore em Pós Ordem
// Uliliza a recursão para percorrer os nos da árvore
    public void posOrdemAjudante(NoArvore no) {
        if (no == null) {
            return;
        }
        posOrdemAjudante(no.noEsquerdo);
        posOrdemAjudante(no.noDireito);
        JOptionPane.showMessageDialog(null,no.dado+"");
    }
    
// Método para buscar o nivel do elemento
// na arvoré ( Exercício 14 da lista de Estrutura de Dados )
    public void busca(int x) {
        buscaAjudante(raiz, x);
    }
    
    int contador = 0; // variavél para controlar o nivel da arvoré
// Método para percorrer a arvoré e achar o elemento
    public void buscaAjudante(NoArvore no, int x) {
        if (no == null) {
            JOptionPane.showMessageDialog(null,"\n Nivel -1 \n");
        } else if (no.dado == x) {
             JOptionPane.showMessageDialog(null,"\n Nivel " + contador);
                  } else if (no.dado > x) {
            if (no != null) {
                contador++;
                buscaAjudante(no.noEsquerdo, x);
            }
        } else if (no.dado < x) {
            if (no != null) {
                contador++;
                buscaAjudante(no.noDireito, x);
            }
        }
    }
    
// Exercício 12
    public void retorna(int x) {
        procuraAjudante(raiz, x);
    }
    
// método para realizar sei la já não sei mais nada
    public void procuraAjudante(NoArvore no, int x) {
        if (no.dado == x) {
            JOptionPane.showMessageDialog(null,"\n" + no.dado);
        } else if (no.noDireito.dado == x) {
            JOptionPane.showMessageDialog(null,"\n" + no.dado);
        } else if (no.noEsquerdo.dado == x) {
            JOptionPane.showMessageDialog(null,"\n" + no.dado);
        } else if (no.dado > x) {
            procuraAjudante(no.noEsquerdo, x);
        } else {
            procuraAjudante(no.noDireito, x);
        }
    }
}
